import os
import openai
import json
from typing import Union
import subprocess
from utils import read_text_from_file, save_file,load_config
import os
import sys

# print(os.environ["version_info_infile"])


# 遍历所有环境变量并打印键值对
# for key, value in os.environ.items():
#     print(f"{key}: {value}")

#
project_config = load_config("config.json")
title = project_config["title"]

client = openai.OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

def create_ppt_script(course_script):
    system_message = "你是一位专业的 PPT 专家，专注于根据课程脚本开发教学 PPT。"

    prompt = (
        f"将以下课程脚本转换为 PPT 格式：\n\n"
        f"{course_script}\n\n"
        "请遵循以下指导原则：\n"
        "保持原有的章节结构，注意标题页和总结页，此外中间的页面不要额外生成内容。"
        "仅生成PPT框架的内容。结尾不要写任何寄语，会被当作一个新的片段。在ppt里不要写任何备注。"
        "1. **提炼关键信息**：避免冗长段落。\n"
        "2. **使用简短标题**：聚焦于要点。\n"
        "3. **内容简洁明了**：去除多余信息。\n"
        "4. **结合图片辅助**：在适当的位置插入图片。\n"
        "5. **不新增内容**：确保不添加任何额外信息。\n"

        "格式要求：\n"
        "1. 正文使用清晰的有序和无序列表：有序列表用于顺序内容，无序列表用于其它内容。\n"
        "2. 确保代码片段格式规范。\n"
        "3. 输出必须是 Markdown 格式。\n\n"
        "\n 不要输出 ### 三级标题\n"
        "\n 遵照原文不要生成新的 ## 二级标题\n"
        "4. 允许使用 1 级和 2 级标题，禁止出现 3 级及以上标题。\n"
        "5. 输出中不得包含 ```markdown 和 ```。\n"
        "6. 图片不显示为列表。\n"

        "输出要求：\n"
        "输出应仅包含 Markdown 格式的 PPT 脚本，禁止任何解释性文字。\n"
        "示例输出格式：\n"
        "# 云计算深入探索\n"
        "![云计算深入探索](https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/1d/2c/20240923/f1ceb422/56a52df0-426f-4352-bbf6-40ffeb1cb04e-1.png?Expires=1727165843&OSSAccessKeyId=LTAI5tQZd8AEcZX6KZV4G8qL&Signature=YaCArgLeSs4y3SLcROEBfiUnACc%3D)\n"
        "## 什么是云计算？\n"
        "- 通过互联网提供服务\n"
        "- 按需获取\n"
        "- 按量付费\n"
        "![什么是云计算](https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/1d/aa/20240923/f1ceb422/8681083c-c304-45fd-af78-ecb68174561d-1.png?Expires=1727165862&OSSAccessKeyId=LTAI5tQZd8AEcZX6KZV4G8qL&Signature=I3MMGZA3mcQWZ24yz7qkdPl5G2Y%3D)\n"
    )

    # 直接调用 API 获取课程脚本
    completion = client.chat.completions.create(
        model="qwen-max",
        messages=[
            {"role": "system", "content": system_message},
            {"role": "user", "content": prompt},
        ],
    )

    # 如果 model_dump_json() 返回字符串需要解析为 JSON
    dumped_json = json.loads(completion.model_dump_json())

    # 使用正确的属性访问生成的内容
    return dumped_json['choices'][0]['message']['content']

def convert_md_to_marp(ppt_script):
    system_message = "你是一位专业的 Marp 专家，专注于将内容从 Markdwon 转换为 Marp 格式。"

    prompt = (
        f"请将以下内容转换为 Marp 格式：\n\n"
        f"{ppt_script}\n\n"
        "请遵循以下要求：\n"
        "1. **Marp 固定开头格式**：\n"
        "   ---\n"
        "   marp: true\n"
        "   theme: default\n"
        "   paginate: true\n"
        "   size: 16:9\n"
        "   ---\n"
        "2. **封面和封底图片**格式为：`![bg](url)`。\n"
        "3. **正文图片**格式为：`![bg left](url)` 或 `![bg right](url)`。\n"
        "4. **结尾**不得包含 `---`。\n"
        "5. **一级标题**和**二级标题**之间必须使用 `---` 分隔。\n"
        "6. 生成的内容开头和结尾不包含 ```。\n"
        "\n输出要求：\n"
        "\n不要输出 ### 三级标题\n"
        "\n遵照原文不要生成新的 ## 二级标题\n"
        "输出应仅包含 Marp 格式的 PPT 脚本，不要添加其他内容。\n"
        "示例输出格式：\n"
        "---\n"
        "marp: true\n"
        "theme: default\n"
        "paginate: true\n"
        "size: 16:9\n"
        "---\n"
        "![bg](https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/1d/2c/20240923/f1ceb422/56a52df0-426f-4352-bbf6-40ffeb1cb04e-1.png?Expires=1727165843&OSSAccessKeyId=LTAI5tQZd8AEcZX6KZV4G8qL&Signature=YaCArgLeSs4y3SLcROEBfiUnACc%3D)\n"
        "# 云计算深入探索\n"
        "---\n"
        "![bg left](https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/1d/aa/20240923/f1ceb422/8681083c-c304-45fd-af78-ecb68174561d-1.png?Expires=1727165862&OSSAccessKeyId=LTAI5tQZd8AEcZX6KZV4G8qL&Signature=I3MMGZA3mcQWZ24yz7qkdPl5G2Y%3D)\n"
        "## 什么是云计算？\n"
        "- 通过互联网提供服务\n"
        "- 按需获取\n"
        "- 按量付费\n"
    )
    # 直接调用 API 获取课程脚本
    completion = client.chat.completions.create(
        model="qwen-max",
        messages=[
            {"role": "system", "content": system_message},
            {"role": "user", "content": prompt},
        ],
    )

    # 如果 model_dump_json() 返回字符串需要解析为 JSON
    dumped_json = json.loads(completion.model_dump_json())

    # 使用正确的属性访问生成的内容
    text = dumped_json['choices'][0]['message']['content']
    text = text.replace("```\n","").replace("\n```","")
    return text

# 从指定目录读取首个文件内容
course_script_file = project_config["course_script_with_illustrations_file_path"].format(title=project_config["title"])

# 读取课程脚本
course_script = read_text_from_file(course_script_file)

# 确保课程脚本不为空
if not course_script:
    raise ValueError("课程脚本为空，无法生成 PPT。")

# 1、调用函数生成 PPT 脚本
ppt_script = create_ppt_script(course_script)
print(ppt_script)

# 构造文件名
ppt_script_file_path = project_config["ppt_script_file_path"].format(title=project_config["title"])

# 调用函数保存PPT
save_file(ppt_script, ppt_script_file_path)

ppt_script_file_path = project_config["ppt_script_file_path"].format(title=project_config["title"])
ppt_script = read_text_from_file(ppt_script_file_path)

# 确保 PPT 脚本不为空
if not ppt_script:
    raise ValueError("PPT 脚本为空，无法进行转换。")

# 2、调用函数生成 Marp 格式的脚本
marp_script = convert_md_to_marp(ppt_script)
print(marp_script)

# 构造文件名
marp_script_file_path = project_config["marp_script_file_path"].format(title=project_config["title"])

# 保存marp文件
save_file(marp_script, marp_script_file_path)

marp_script_file_path = project_config["marp_script_file_path"].format(title=project_config["title"])
marp_script = read_text_from_file(marp_script_file_path)

# 确保 Marp 脚本不为空
if not marp_script:
    raise ValueError("Marp 脚本为空，无法生成 PPT。")


marp_export_folder = project_config["marp_export_folder"]

print('marp_script_file_path=', marp_script_file_path)
print('marp_export_folder', marp_export_folder)

# ./output/marp_script/云计算_Marp脚本.md
# ./output/marp_expo
# python convert_md_pdf.py ./output/marp_script/云计算_Marp脚本.md ./output/marp_export

# python convert_md_pdf.py "./output/marp_script/云计算_Marp脚本.md" "./output/marp_export"

# 生成pdf
# marp --html --allow-local-files --output ./output/marp_export/云计算_Marp脚本/云计算_Marp脚本.pdf --format pdf ./output/marp_script/云计算_Marp脚本.md

# 生成pptx
# marp --html --allow-local-files --output "./output/marp_export/云计算_Marp脚本/云计算_Marp脚本.pptx" "./output/marp_script/云计算_Marp脚本.md"